1 using UnityEngine;
2 using
System.Collections;
3 using
System.Collections.Generic;
4
5 ///
<summary>
6 ///
This class helps you to synchronize Mecanim animations
7 ///
Simply add the component to your GameObject and make sure that
8 ///
the PhotonAnimatorView is added to the list of observed components
9 ///
</summary>
10 [RequireComponent(
typeof( Animator ) )]
11 [RequireComponent(
typeof( PhotonView ) )]
12 [AddComponentMenu(
"Photon Networking/Photon Animator View")]
13 public
class PhotonAnimatorView : MonoBehaviour
14 {
15     
#region Enums
16     
public enum ParameterType
17     {
18         Float =
1,
19         Int =
3,
20         Bool =
4,
21         Trigger =
9,
22     }
23
24     
public enum SynchronizeType
25     {
26         Disabled =
0,
27         Discrete =
1,
28         Continuous =
2,
29     }
30
31     
[System.Serializable]
32     
public class SynchronizedParameter
33     {
34         
public ParameterType Type;
35         
public SynchronizeType SynchronizeType;
36         
public string Name;
37     }
38
39     
[System.Serializable]
40     
public class SynchronizedLayer
41     {
42         
public SynchronizeType SynchronizeType;
43         
public int LayerIndex;
44     }
45     
#endregion
46
47     
#region Properties
48 #
if PHOTON_DEVELOP
49     
public PhotonAnimatorView ReceivingSender;
50 #endif
51     
#endregion
52
53     
#region Members
54     Animator m_Animator;
55
56     PhotonStreamQueue m_StreamQueue;
57
58     
//These fields are only used in the CustomEditor for this script and would trigger a
59     
//"this variable is never used" warning, which I am suppressing here
60 #pragma warning disable
0414
61     
[HideInInspector]
62     
[SerializeField]
63     
bool ShowLayerWeightsInspector = true;
64
65     
[HideInInspector]
66     
[SerializeField]
67     
bool ShowParameterInspector = true;
68 #pragma warning restore
0414
69
70     
[HideInInspector]
71     
[SerializeField]
72     List<SynchronizedParameter> m_SynchronizeParameters =
new List<SynchronizedParameter>();
73
74     
[HideInInspector]
75     
[SerializeField]
76     List<SynchronizedLayer> m_SynchronizeLayers =
new List<SynchronizedLayer>();
77
78     Vector3 m_ReceiverPosition;
79     
float m_LastDeserializeTime;
80     
bool m_WasSynchronizeTypeChanged = true;
81     PhotonView m_PhotonView;
82     
#endregion
83
84     
#region Unity
85     
void Awake()
86     {
87         m_PhotonView = GetComponent<PhotonView>();
88         m_StreamQueue =
new PhotonStreamQueue( 120 );
89
90         m_Animator = GetComponent<Animator>();
91     }
92
93     
void Update()
94     {
95         
if( m_PhotonView.isMine == false && PhotonNetwork.connected == true )
96         {
97             m_Animator.applyRootMotion =
false;
98         }
99
100         
if( m_PhotonView.isMine == true )
101         {
102             SerializeDataContinuously();
103         }
104         
else
105         {
106             DeserializeDataContinuously();
107         }
108     }
109     
#endregion
110
111     
#region Setup Synchronizing Methods
112     ///
<summary>
113     ///
Check if a specific layer is configured to be synchronize
114     ///
</summary>
115     ///
<param name="layerIndex">Index of the layer.</param>
116     ///
<returns>True if the layer is synchronized</returns>
117     
public bool DoesLayerSynchronizeTypeExist( int layerIndex )
118     {
119         
return m_SynchronizeLayers.FindIndex( item => item.LayerIndex == layerIndex ) != -1;
120     }

121
122     ///
<summary>
123     ///
Check if the specified parameter is configured to be synchronized
124     ///
</summary>
125     ///
<param name="name">The name of the parameter.</param>
126     ///
<returns>True if the parameter is synchronized</returns>
127     
public bool DoesParameterSynchronizeTypeExist( string name )
128     {
129         
return m_SynchronizeParameters.FindIndex( item => item.Name == name ) != -1;
130     }

131
132     ///
<summary>
133     ///
Get a list of all synchronized layers
134     ///
</summary>
135     ///
<returns>List of SynchronizedLayer objects</returns>
136     
public List<SynchronizedLayer> GetSynchronizedLayers()
137     {
138         
return m_SynchronizeLayers;
139     }

140
141     ///
<summary>
142     ///
Get a list of all synchronized parameters
143     ///
</summary>
144     ///
<returns>List of SynchronizedParameter objects</returns>
145     
public List<SynchronizedParameter> GetSynchronizedParameters()
146     {
147         
return m_SynchronizeParameters;
148     }

149
150     ///
<summary>
151     ///
Gets the type how the layer is synchronized
152     ///
</summary>
153     ///
<param name="layerIndex">Index of the layer.</param>
154     ///
<returns>Disabled/Discrete/Continuous</returns>
155     
public SynchronizeType GetLayerSynchronizeType( int layerIndex )
156     {
157         
int index = m_SynchronizeLayers.FindIndex( item => item.LayerIndex == layerIndex );
158
159         
if( index == -1 )
160         {
161             
return SynchronizeType.Disabled;
162         }
163
164         
return m_SynchronizeLayers[ index ].SynchronizeType;
165     }

166
167     ///
<summary>
168     ///
Gets the type how the parameter is synchronized
169     ///
</summary>
170     ///
<param name="name">The name of the parameter.</param>
171     ///
<returns>Disabled/Discrete/Continuous</returns>
172     
public SynchronizeType GetParameterSynchronizeType( string name )
173     {
174         
int index = m_SynchronizeParameters.FindIndex( item => item.Name == name );
175
176         
if( index == -1 )
177         {
178             
return SynchronizeType.Disabled;
179         }
180
181         
return m_SynchronizeParameters[ index ].SynchronizeType;
182     }

183
184     ///
<summary>
185     ///
Sets the how a layer should be synchronized
186     ///
</summary>
187     ///
<param name="layerIndex">Index of the layer.</param>
188     ///
<param name="synchronizeType">Disabled/Discrete/Continuous</param>
189     
public void SetLayerSynchronized( int layerIndex, SynchronizeType synchronizeType )
190     {
191         
if( Application.isPlaying == true )
192         {
193             m_WasSynchronizeTypeChanged =
true;
194         }
195
196         
int index = m_SynchronizeLayers.FindIndex( item => item.LayerIndex == layerIndex );
197
198         
if( index == -1 )
199         {
200             m_SynchronizeLayers.Add(
new SynchronizedLayer { LayerIndex = layerIndex, SynchronizeType = synchronizeType } );
201         }
202         
else
203         {
204             m_SynchronizeLayers[ index ].SynchronizeType = synchronizeType;
205         }
206     }

207
208     ///
<summary>
209     ///
Sets the how a parameter should be synchronized
210     ///
</summary>
211     ///
<param name="name">The name of the parameter.</param>
212     ///
<param name="synchronizeType">Disabled/Discrete/Continuous</param>
213     
public void SetParameterSynchronized( string name, ParameterType type, SynchronizeType synchronizeType )
214     {
215         
if( Application.isPlaying == true )
216         {
217             m_WasSynchronizeTypeChanged =
true;
218         }
219
220         
int index = m_SynchronizeParameters.FindIndex( item => item.Name == name );
221
222         
if( index == -1 )
223         {
224             m_SynchronizeParameters.Add(
new SynchronizedParameter { Name = name, Type = type, SynchronizeType = synchronizeType } );
225         }
226         
else
227         {
228             m_SynchronizeParameters[ index ].SynchronizeType = synchronizeType;
229         }
230     }
231     
#endregion
232
233     
#region Serialization
234     
void SerializeDataContinuously()
235     {
236         
if( m_Animator == null )
237         {
238             
return;
239         }
240
241         
for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
242         {
243             
if( m_SynchronizeLayers[ i ].SynchronizeType == SynchronizeType.Continuous )
244             {
245                 m_StreamQueue.SendNext( m_Animator.GetLayerWeight( m_SynchronizeLayers[ i ].LayerIndex ) );
246             }
247         }
248
249         
for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
250         {
251             SynchronizedParameter parameter = m_SynchronizeParameters[ i ];
252
253             
if( parameter.SynchronizeType == SynchronizeType.Continuous )
254             {
255                 
256                 
switch( parameter.Type )
257                 {
258                 
case ParameterType.Bool:
259                     m_StreamQueue.SendNext( m_Animator.GetBool( parameter.Name ) );
260                     
break;
261                 
case ParameterType.Float:
262                     m_StreamQueue.SendNext( m_Animator.GetFloat( parameter.Name ) );
263                     
break;
264                 
case ParameterType.Int:
265                     m_StreamQueue.SendNext( m_Animator.GetInteger( parameter.Name ) );
266                     
break;
267                 
case ParameterType.Trigger:
268
269                     
break;
270                 }
271             }
272         }
273     }
274
275     
void DeserializeDataContinuously()
276     {
277         
if( m_StreamQueue.HasQueuedObjects() == false )
278         {
279             
return;
280         }
281
282         
for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
283         {
284             
if( m_SynchronizeLayers[ i ].SynchronizeType == SynchronizeType.Continuous )
285             {
286                 m_Animator.SetLayerWeight( m_SynchronizeLayers[ i ].LayerIndex, (
float)m_StreamQueue.ReceiveNext() );
287             }
288         }
289
290         
for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
291         {
292             SynchronizedParameter parameter = m_SynchronizeParameters[ i ];
293
294             
if( parameter.SynchronizeType == SynchronizeType.Continuous )
295             {
296                 
switch( parameter.Type )
297                 {
298                 
case ParameterType.Bool:
299                     m_Animator.SetBool( parameter.Name, (
bool)m_StreamQueue.ReceiveNext() );
300                     
break;
301                 
case ParameterType.Float:
302                     m_Animator.SetFloat( parameter.Name, (
float)m_StreamQueue.ReceiveNext() );
303                     
break;
304                 
case ParameterType.Int:
305                     m_Animator.SetInteger( parameter.Name, (
int)m_StreamQueue.ReceiveNext() );
306                     
break;
307                 
case ParameterType.Trigger:
308
309                     
break;
310                 }
311             }
312         }
313     }
314
315     
void SerializeDataDiscretly( PhotonStream stream )
316     {
317         
for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
318         {
319             
if( m_SynchronizeLayers[ i ].SynchronizeType == SynchronizeType.Discrete )
320             {
321                 stream.SendNext( m_Animator.GetLayerWeight( m_SynchronizeLayers[ i ].LayerIndex ) );
322             }
323         }
324
325         
for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
326         {
327             SynchronizedParameter parameter = m_SynchronizeParameters[ i ];
328
329             
if( parameter.SynchronizeType == SynchronizeType.Discrete )
330             {
331                 
switch( parameter.Type )
332                 {
333                 
case ParameterType.Bool:
334                     stream.SendNext( m_Animator.GetBool( parameter.Name ) );
335                     
break;
336                 
case ParameterType.Float:
337                     stream.SendNext( m_Animator.GetFloat( parameter.Name ) );
338                     
break;
339                 
case ParameterType.Int:
340                     stream.SendNext( m_Animator.GetInteger( parameter.Name ) );
341                     
break;
342                 
case ParameterType.Trigger:
343
344                     
break;
345                 }
346             }
347         }
348     }
349
350     
void DeserializeDataDiscretly( PhotonStream stream )
351     {
352         
for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
353         {
354             
if( m_SynchronizeLayers[ i ].SynchronizeType == SynchronizeType.Discrete )
355             {
356                 m_Animator.SetLayerWeight( m_SynchronizeLayers[ i ].LayerIndex, (
float)stream.ReceiveNext() );
357             }
358         }
359
360         
for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
361         {
362             SynchronizedParameter parameter = m_SynchronizeParameters[ i ];
363
364             
if( parameter.SynchronizeType == SynchronizeType.Discrete )
365             {
366                 
switch( parameter.Type )
367                 {
368                 
case ParameterType.Bool:
369                     
if( stream.PeekNext() is bool == false )
370                     {
371                         
return;
372                     }
373
374                     m_Animator.SetBool( parameter.Name, (
bool)stream.ReceiveNext() );
375                     
break;
376                 
case ParameterType.Float:
377                     
if( stream.PeekNext() is float == false )
378                     {
379                         
return;
380                     }
381
382                     m_Animator.SetFloat( parameter.Name, (
float)stream.ReceiveNext() );
383                     
break;
384                 
case ParameterType.Int:
385                     
if( stream.PeekNext() is int == false )
386                     {
387                         
return;
388                     }
389
390                     m_Animator.SetInteger( parameter.Name, (
int)stream.ReceiveNext() );
391                     
break;
392                 
case ParameterType.Trigger:
393
394                     
break;
395                 }
396             }
397         }
398     }
399
400     
void SerializeSynchronizationTypeState( PhotonStream stream )
401     {
402         
byte[] states = new byte[ m_SynchronizeLayers.Count + m_SynchronizeParameters.Count ];
403
404         
for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
405         {
406             states[ i ] = (
byte)m_SynchronizeLayers[ i ].SynchronizeType;
407         }
408
409         
for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
410         {
411             states[ m_SynchronizeLayers.Count + i ] = (
byte)m_SynchronizeParameters[ i ].SynchronizeType;
412         }
413
414         stream.SendNext( states );
415     }
416
417     
void DeserializeSynchronizationTypeState( PhotonStream stream )
418     {
419         
byte[] state = (byte[])stream.ReceiveNext();
420
421         
for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
422         {
423             m_SynchronizeLayers[ i ].SynchronizeType = (SynchronizeType)state[ i ];
424         }
425
426         
for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
427         {
428             m_SynchronizeParameters[ i ].SynchronizeType = (SynchronizeType)state[ m_SynchronizeLayers.Count + i ];
429         }
430     }
431
432     
void OnPhotonSerializeView( PhotonStream stream, PhotonMessageInfo info )
433     {
434         
if( m_Animator == null )
435         {
436             
return;
437         }
438
439         
if( stream.isWriting == true )
440         {
441             
if( m_WasSynchronizeTypeChanged == true )
442             {
443                 m_StreamQueue.Reset();
444                 SerializeSynchronizationTypeState( stream );
445
446                 m_WasSynchronizeTypeChanged =
false;
447             }
448
449             m_StreamQueue.Serialize( stream );
450             SerializeDataDiscretly( stream );
451         }
452         
else
453         {
454 #
if PHOTON_DEVELOP
455             
if( ReceivingSender != null )
456             {
457                 ReceivingSender.OnPhotonSerializeView( stream, info );
458             }
459             
else
460 #endif
461             {
462                 
if( stream.PeekNext() is byte[] )
463                 {
464                     DeserializeSynchronizationTypeState( stream );
465                 }
466
467                 m_StreamQueue.Deserialize( stream );
468                 DeserializeDataDiscretly( stream );
469             }
470         }
471     }
472     
#endregion
473 }


This class helps you to synchronize Mecanim animations

Simply add the component to your GameObject and make sure that

the PhotonAnimatorView is added to the list of observed components

These fields are only used in the CustomEditor for this script and would trigger a

"this variable is never used" warning, which I am suppressing here

Check if a specific layer is configured to be synchronize

Index of the layer.

True if the layer is synchronized

Check if the specified parameter is configured to be synchronized

The name of the parameter.

True if the parameter is synchronized

Get a list of all synchronized layers

List of SynchronizedLayer objects

Get a list of all synchronized parameters

List of SynchronizedParameter objects

Gets the type how the layer is synchronized

Index of the layer.

DisabledDiscreteContinuous

Gets the type how the parameter is synchronized

The name of the parameter.

DisabledDiscreteContinuous

Sets the how a layer should be synchronized

Index of the layer.

DisabledDiscreteContinuous

Sets the how a parameter should be synchronized

The name of the parameter.

DisabledDiscreteContinuous




Trò chơi Tic-Tac-Toe, game đánh caro full source code 53.463 lượt xem

Gõ tìm kiếm nhanh...